#include "decorator.h"

using namespace decorator;

std::string Beverage::getDescription()
{
    return this->m_descri;
}

int Beverage::cost()
{
    return 0;
}

HouseBlend::HouseBlend()
{
    this->m_descri = "HouseBlend";
}

std::string HouseBlend::getDescription()
{
    return Beverage::getDescription();
}

int HouseBlend::cost()
{
    return 1;
}

DarkRoast::DarkRoast()
{
    this->m_descri = "DarkRoast";
}

std::string DarkRoast::getDescription()
{
    return Beverage::getDescription();
}

int DarkRoast::cost()
{
    return 2;
}

Espresso::Espresso()
{
    this->m_descri = "Espresso";
}

std::string Espresso::getDescription()
{
    return Beverage::getDescription();
}

int Espresso::cost()
{
    return 3;
}

Decaf::Decaf()
{
    this->m_descri = "Decaf";
}

std::string Decaf::getDescription()
{
    return Beverage::getDescription();
}

int Decaf::cost()
{
    return 4;
}

Milk::Milk(Beverage* b)
{
    this->m_b = b;
}

std::string Milk::getDescription()
{
    return this->m_b->getDescription() + ",Milk";
}

int Milk::cost()
{
    return this->m_b->cost() + 1;
}

Mocha::Mocha(Beverage* b)
{
    this->m_b = b;
}

std::string Mocha::getDescription()
{
    return this->m_b->getDescription() + ",Mocha";
}

int Mocha::cost()
{
    return this->m_b->cost() + 2;
}

Soy::Soy(Beverage* b)
{
    this->m_b = b;
}

std::string Soy::getDescription()
{
    return this->m_b->getDescription() + ",Soy";
}

int Soy::cost()
{
    return this->m_b->cost() + 3;
}

Whip::Whip(Beverage* b)
{
    this->m_b = b;
}

std::string Whip::getDescription()
{
    return this->m_b->getDescription() + ",Whip";
}

int Whip::cost()
{
    return this->m_b->cost() + 4;
}
